home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / tcp_ip / timed / timed.c < prev    next >
Text File  |  1992-04-01  |  2KB  |  99 lines

  1. /* Internet Time Server
  2.  * Author: Brian K. Teravskis, WD0EFL
  3.  * Date: 02/15/92
  4.  *
  5.  * Based on RFC868 Time Protocol
  6.  */
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <time.h>
  10. #include "global.h"
  11. #include "mbuf.h"
  12. #include "socket.h"
  13. #include "session.h"
  14. #include "proc.h"
  15.  
  16. #define DIFFTIME 2208988800
  17. #define IPPORT_TIME 37
  18.  
  19. static int Stime = -1;    /* Prototype socket for service */
  20.  
  21. static void timeserver __ARGS((int s,void *unused,void *p));
  22.  
  23. /* Start up time server */
  24. int
  25. time1(argc,argv,p)
  26. int argc;
  27. char *argv[];
  28. void *p;
  29. {
  30.     struct sockaddr_in lsocket;
  31.     int s;
  32.  
  33.     if(Stime != -1){
  34.         return 0;
  35.     }
  36.     psignal(Curproc,0);    /* Don't keep the parser waiting */
  37.     chname(Curproc,"Time listener");
  38.  
  39.     lsocket.sin_family = AF_INET;
  40.     lsocket.sin_addr.s_addr = INADDR_ANY;
  41.     lsocket.sin_port = IPPORT_TIME;
  42.  
  43.     Stime = socket(AF_INET,SOCK_STREAM,0);
  44.     bind(Stime,(char *)&lsocket,sizeof(lsocket));
  45.     listen(Stime,1);
  46.     for(;;){
  47.         if((s = accept(Stime,NULLCHAR,(int *)NULL)) == -1)
  48.             break;    /* Service is shutting down */
  49.  
  50.         /* Spawn a server */
  51.         newproc("timeserver",512,timeserver,s,NULL,NULL,0);
  52.     } /* for (;;;) */
  53.     return 0;
  54. } /* time1 */
  55.  
  56.  
  57.  
  58. /*
  59.  * Serve up the time to the connected client
  60.  */
  61. static void
  62. timeserver(s,unused,p)
  63. int s;
  64. void *unused;
  65. void *p;
  66. {
  67.     struct mbuf    *bp;
  68.     char    datetime[4];
  69.  
  70.     sockmode(s,SOCK_BINARY);
  71.     sockowner(s,Curproc);
  72.     log(s,"Open Time");
  73.     /*
  74.      * Change 1970 start time to 1900 start time, and put
  75.      * it in network order
  76.      */
  77.     put32(datetime,time((time_t *)0)+DIFFTIME);
  78.  
  79.     /* enqueue for transmission */
  80.     bp = qdata(datetime,sizeof(int32));
  81.     /* Send time data */
  82.     if(send_mbuf(s,bp,0,NULLCHAR,0) == -1)
  83.         log(s,"Time Failed");
  84.  
  85.     close_s(s);
  86.     log(s,"Close Time");
  87. } /* timeserver */
  88.  
  89. /* Stop the time server */
  90. int
  91. time0(argc,argv,p)
  92. int argc;
  93. char *argv[];
  94. void *p;
  95. {
  96.     close_s(Stime);
  97.     Stime = -1;
  98.     return 0;
  99. } /* time0 */